﻿#define _CRT_SECURE_NO_WARNINGS 1

//#include <stdio.h>
//
//int main()
//{
//
//	return 0;
//}

//#include <stdio.h>
//int main()
//{
//    int arr[] = { 1,2,3,4,5 };
//    short* p = (short*)arr;
//    int i = 0;
//    for (i = 0; i < 4; i++)
//    {
//        *(p + i) = 0;
//    }
//
//    for (i = 0; i < 5; i++)
//    {
//        printf("%d ", arr[i]);
//    }
//    return 0;
//}

#include <stdio.h>
#include <string.h>	

void reverse(char* left, char* right)
{
	while (left < right)
	{
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}

int main()
{
	char arr[101] = { 0 };
	fgets(arr,101,stdin);
	//逆序整个字符串
	int len = (int)strlen(arr);
	reverse(arr, arr + len - 1);
	
	//逆序每一个单词
	char* start = arr;
	char* end = start;
	while (*start != '\0')//当*start等于\0时，停止逆序
	{
		while (*end != ' ' && *end != '\0')//注意最后一个单词的后面不是空格
		{
			end++;
		}
		reverse(start, end - 1);
		if(end != '\0')//如果最后一个单词在向后移动时，会导致start跳过\0从而导致死循环
			end++;
		start = end;
	}
	puts(arr);
	return 0;
}

//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	char arr[20] = { 0 };
//	gets(arr);
//	int len = strlen(arr);
//	char* end = arr + len - 1;
//	char* start = arr;
//	while (start <= end)
//	{
//		printf("%c", *end);
//		end--;
//	}
//	return 0;
//}
// 
//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	char arr[20] = { 0 };
//	gets(arr);
//	char* left = arr;
//	int len = (int)strlen(arr);
//	char* right = arr + len - 1;
//	while (left < right)
//	{
//		char temp = *left;
//		*left = *right;
//		*right = temp;
//		left++;
//		right--;
//	}
//	puts(arr);
//	return 0;
//}
//#include <stdio.h>
//int num(int a, int b)
//{
//	if (a >= b)
//		return a - b;
//	else
//		return b - a;
//}
//int main()
//{
//	int n, m;
//	scanf("%d %d", &n, &m);
//	int a[100] = { 0 };
//	int b[100] = { 0 };
//	int sum1 = 0, sum2 = 0, min, k, l;
//	for (int i = 0; i < n; i++)
//	{
//		scanf("%d", &a[i]);
//	}
//	for (int i = 0; i < m; i++)
//	{
//		scanf("%d", &b[i]);
//	}
//	for (int i = 0; i < n; i++)
//	{
//		sum1 += a[i];
//	}
//	min = sum1;
//	for (int i = 0; i < m; i++)
//	{
//		sum2 = b[i];
//		for (int j = i + 1; j <= m; j++)
//		{
//			if (num(sum1, sum2) < min)
//			{
//				min = num(sum1, sum2);
//				k = i;
//				l = j;
//			}
//			sum2 += b[j];
//
//		}
//	}
//	for (int i = k; i < l; i++)
//	{
//		printf("%d ", b[i]);
//	}
//
//	return 0;
//}

//#include <stdio.h>
//
//int main()
//{
//	int a;
//	int* pa;
//	printf("%d\n", a);
//	printf("%p\n", pa);
//	return 0;
//}


//#include<stdio.h>
//#include<string.h>
////#include<algorithm>
//typedef struct nodelink
//{
//	long num;
//	char name[20];
//	int Chinese;
//	int Math;
//	int English;
//	double aver;
//}stu;
//int main()
//{
//	stu b[10];
//	FILE* pf;
//	pf = fopen("stud.txt", "w");
//	if (pf == NULL)
//	{
//		perror("fopen");
//	}
//	stu a[10];
//	for (int i = 0; i < 3; i++)
//	{
//		printf("请输入第%d个学生的学号，姓名，语文成绩，数学成绩，英语成绩:\n", i + 1);
//		scanf("%ld", &(a[i].num));
//		//getchar();
//		/*fgets(a[i].name, 20, stdin);*/
//		scanf("%s", a[i].name);
//		//a[i].name[strlen(a[i].name) - 1] = '\0';
//		scanf("%d%d%d", &a[i].Chinese, &a[i].Math, &a[i].English);
//		a[i].aver = (a[i].Chinese + a[i].Math + a[i].English) / 3.0;
//		fprintf(pf, "%ld\t%s\t%d\t%d\t%d\t%.1lf\n", a[i].num, a[i].name, a[i].Chinese, a[i].Math,
//			a[i].English, a[i].aver);
//	}
//	fclose(pf);
//	//pf = NULL;
//	int i = 0;
//
//	FILE* pf2 = fopen("stud.txt", "r");
//	for (i = 0; i < 3; i++)
//	{
//		fscanf(pf2, "%ld\t%s\t%d\t%d\t%d\t%lf\n", &b[i].num, b[i].name, &b[i].Chinese, &b[i].Math,
//			&b[i].English, &b[i].aver);
//	}
//		
//	fclose(pf2);
//	pf2 = NULL;
//	for (i = 0; i < 3; i++)
//	{
//		printf("%ld\t%s\t%d\t%d\t%d\t%.1lf\n", b[i].num, b[i].name, b[i].Chinese, b[i].Math,
//			b[i].English, b[i].aver);
//	}
//	FILE* pf1;
//	pf1 = fopen("studsort.txt", "w");
//	stu k = {0};
//	for (int i = 0; i < 3; i++)
//		for (int j = i; j < 3; j++)
//		{
//			if (b[i].aver > b[j].aver)
//			{
//				k = b[i];
//				b[i] = b[j];
//				b[j] = k;
//			}
//		}
//	for (int i = 0; i < 3; i++)
//	{
//		fprintf(pf1, "%ld\t%s\t%d\t%d\t%d\t%3lf\n", b[i].num, b[i].name, b[i].Chinese, 
//			b[i].Math, b[i].English, b[i].aver);
//	}
//	fclose(pf1);
//	pf1 = NULL;
//	return 0;
//}

//笨小猴

//#include <stdio.h>
//#include <string.h>
//
//int judge_prime(int num)
//{
//	int i = 0;
//	for (i = 2; i < num / 2; i++)
//	{
//		if (num % i == 0 || num == 1 || num == 0)
//		{
//			return 0;
//		}
//	}
//	return 1;
//}
//int main()
//{
//	char arr[101];
//	gets(arr);
//	int maxn = -1;
//	int minn = 101;
//	char* start = arr;
//	int count = 0;
//	while (*start != '\0')
//	{
//		char* end = arr;
//		while (*end != '\0')
//		{
//			if (*end == *start)
//				count++;
//			end++;
//		}
//		if (count > maxn)
//			maxn = count;
//		if ((count < minn))
//			minn = count;
//		count = 0;
//		start++;
//	}
//	int ret = judge_prime(maxn - minn);
//	if (ret == 1)
//	{
//		printf("Lucky Word\n%d", maxn - minn);
//	}
//	else
//	{ 
//		int m = 0;
//		printf("No Answer\n%d", m);
//	}
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//
//int main()
//{
//	char ch[150];
//	gets(ch);
//	int i = 0, j = 0;
//	int count = 1;
//	int flag = 0;
//	int maxn = 1, minn = 100;
//	for (i = 0; i < strlen(ch); i++)
//	{
//
//
//		for (j = i + 1; j <= strlen(ch); j++)
//		{
//			if (ch[j] == ch[i])
//				count++;
//		}
//		if (count > maxn)
//		{
//			maxn = count;
//		}
//		if (count < minn)
//		{
//			minn = count;
//		}
//		count = 1;
//	}
//	for (i = 2; i < maxn - minn; i++)
//	{
//		if ((maxn - minn) == 1)
//			break;
//		if ((maxn - minn) % i == 0 && i > 2)
//		{
//			flag = 1;
//			break;
//		}
//	}
//	int result = maxn - minn;
//	if (flag == 0 && result != 0 && result != 1)
//	{
//		printf("Lucky Word\n");
//		printf("%d", result);
//	}
//	else
//	{
//		result = 0;
//		printf("No Answer\n");
//		printf("%d\n", result);
//	}
//	return 0;
//}